<?php

/*
 * Modulo responsavel pela criacao de post com abas
 * @author Adelson murakami
 */

class Mod_tabs {
    /* =========================================================================
     * Propriedade que cria a tabela que ira armazenar os dados inseridos no
     * na Abas/Ancoras(obrigatorio)
      ========================================================================= */

    private $sql_tabs = <<<SQLTABS
        CREATE TABLE IF NOT EXISTS cms_tabs( 
            `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
            `registro_tabs` VARCHAR(100) NOT NULL,
            `shortcode_tabs` VARCHAR(155) NOT NULL,
            `data_criacao` TIMESTAMP NULL DEFAULT NULL, 
            `data_atualizacao` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
        PRIMARY KEY (`id`) )ENGINE=innoDB
SQLTABS;

    /* =========================================================================
     * Propriedade que cria a tabela que ira armazenar os dados inseridos no
     * na Abas/Ancoras(obrigatorio)
      ========================================================================= */
    private $sql_tabs_post = <<<SQLTABSPOST
        CREATE TABLE IF NOT EXISTS `cms_tab_post` (
           	`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
                `id_tabs` INT(11) UNSIGNED NOT NULL,
                `nome_tabs` VARCHAR(100) NOT NULL,
                `conteudo_tabs` TEXT NOT NULL,
                PRIMARY KEY (`id`),
                INDEX `FK_TABS` (`id_tabs`),
                CONSTRAINT `FK_TABS` FOREIGN KEY (`id_tabs`) REFERENCES `cms_tabs` (`id`) ON UPDATE NO ACTION ON DELETE CASCADE
        )
        COLLATE='latin1_swedish_ci'
        ENGINE=InnoDB
        AUTO_INCREMENT=2;
SQLTABSPOST;

    /* =========================================================================
     * propriedade com nome controller do modulo(obrigatorio)
      ========================================================================= */
    private $fileController = "tabs.class.php";

    /* =========================================================================
     * proprieadade que com o path das views do modulo(obrigatorio)
      ========================================================================= */
    private $folderViews = "views/tabs";

    /* =========================================================================
     * propriedade com o caminho da pasta default do modulo(obrigatorio)
      ========================================================================= */
    private $default;

    /* =========================================================================
     * propriedade que ira instacia o obj banco de dados(obrigatorio)
      ========================================================================= */
    private $db;

    /* =========================================================================
     * propriedade que ira instacia o obj de Transferencia do arquivo 
     * controladora(obrigatorio)
      ========================================================================= */
    private $trans;

    /* =========================================================================
     * METODO CONTRUSTOR 
      ========================================================================= */

    public function __construct() {
        $this->db = new Dbconnection();
        $this->db->executeTableSql($this->sql_tabs);
        $this->db->executeTableSql($this->sql_tabs_post);

        //define o valor da pasta default do modulo
        $this->default = str_replace("\\", "/", __DIR__ . "/default/");

        //instacia a classe de transferencia em tempo de execucao
        $this->trans = loadClass::implementCoreClass("transferFile/transfer");
    }

    /* =========================================================================
     * Impleta todas as views e dependecias de JS E CSS do modulo no sitema.
     * Implementa a controladora do modulo na pasta controller do sistema
     * @return bool
      ========================================================================= */

    public function setupModule() {
        $dirDefault = $this->default;
        //$fileControler = $dirDefault.$this->fileController;///controler do modulo 
        $dstController = BASEPATH . "controllers/" . $this->fileController; //pasta do destinno onde sera colado o controller
        //$fileViews     = $dirDefault.$this->folderViews;
        $dstViews = BASEPATH . $this->folderViews;
        $match = null;
        $r_it = new RecursiveDirectoryIterator($dirDefault);
        $r_ii = new RecursiveIteratorIterator($r_it);
        foreach ($r_ii as $folders) {
            if ($folders->getBasename() === "." || $folders->getBasename() === "..") {
                continue;
            }
            $pathname = str_replace("\\", "/", dirname($folders->getPathname())); //nome da pastas dentro do default
            $pathfile = str_replace("\\", "/", $folders->getPathname()); //nome dos arquivos das pastas dentro do default
            //copia o arquivo da views do modulo para a pasta view do sistema
            if (preg_match("/(views.*)/", $pathname, $match)) {
                if (strtolower(end($match)) == $this->folderViews) {
                    $this->trans->transferFile($pathfile, $dstViews . "/" . basename($pathfile));
                }
            }

            //copia o arquivo da controladora do modulo para a pasta controller do sistema
            if (preg_match("@(default)$@i", $pathname, $match)) {
                //$controller = str_replace("default", basename($pathfile), end($match));
                $this->trans->transferFile($pathfile, $dstController);
            }
        }
    }

    //////////////////////////END SETUP MODULE//////////////////////////////////////////////////



    /* =========================================================================
     * METODO QUE LISTAS TODOS OS MODELOS DE ABAS/ANCORAS CRIADO
      ========================================================================= */
    public function listTabs() {
        $consulta = $this->db->select("cms_tabs", "*", "1=1 ORDER BY id DESC");
        return $consulta;
    }

    /* =========================================================================
     * METODO QUE LISTAS TODOS OS CONTEUDO DAS ABAS/ANCORAS CRIADO
     * @PARAM INT $id_tab
      ========================================================================= */

    public function listaTabsPost($id_tab) {
        if (!empty($id_tab) && $id_tab > 0) {
            $consulta = $this->db->select("cms_tab_post", "*", "id_tabs={$id_tab}");
            return $consulta;
        } else {
            return false;
        }
    }

    /* =========================================================================
     * METODO QUE SELECIONA O CONTEUDO DA ABA PARA EDICAO
     * @PARAM INT $id_tab
     * @PARAM INT $id_tab_post
      ========================================================================= */

    public function selectTabPost($id_tab, $id_tab_post) {
        $consulta = $this->db->select("cms_tab_post", "*", "id={$id_tab_post} AND id_tabs='$id_tab' LIMIT 1",true);
        return $consulta;
    }

    /* =========================================================================
     * METODO QUE ADICIONA NOME E O CONTEUDO DAS ABAS/ANCORAS
     * @PARAM ARRAY $post = array com os dados da abas
     * @RETURN JSON STRING
      ========================================================================= */

    public function addTabs($posts) {
        try {
            if (!is_array($posts)) {
                throw new Exception("Erro nao definicao dos parametros - Error in: " . __METHOD__ . " line: " . __LINE__);
            } else if (empty($posts['nome_tabs']) || empty($posts['conteudo_tabs'])) {
                throw new Exception("Todos os campo s&atilde; obrigatorio");
            }
            $dados = array('id_tabs' => $posts['id_tabs'], 'nome_tabs' => strip_tags($posts['nome_tabs']), 'conteudo_tabs' => $posts['conteudo_tabs']);
            $ins = json_decode($this->db->Insert("cms_tab_post", $dados));
            if ($ins->status) {
                $msg = "Conteudo adicionado com sucesso";
            } else {
                $msg = $ins->msg;
            }
            return json_encode(array('status' => $ins->status, 'msg' => $msg));
        } catch (Exception $exc) {
            return json_encode(array('status' => false, 'msg' => $exc->getMessage()));
        }
    }

    /* =========================================================================
     * METODO QUE GRAVA NO BANCO O INDENTIFICADOR DOS POSTS
     * @PARAM ARRAY $posts = POST COM OS DADOS DO INDENTIFICADOR
     * @RETURN STRING JSON
      ========================================================================= */

    public function addShotCodeTabs($posts) {
        try {
            if (!is_array($posts)) {
                throw new Exception("Erro nao definicao dos parametros - Error in: " . __METHOD__ . " line: " . __LINE__, 110);
            } else if (empty($posts['registro_tabs'])) {
                throw new Exception("Campo de preenchimento obrigatorio");
            }
            $tabela = "cms_tabs";
            $dados = array("registro_tabs" => $posts['registro_tabs'], 'data_criacao' => date('Y-m-d H:i:s'));
            $ins = json_decode($this->db->Insert($tabela, $dados));
            $lastID = 0;
            $shortCode = array();
            if ($ins->status) {
                $lastID = $this->db->lastId;
                $shortCode = array("shortcode_tabs" => "[tabs:" . str_replace(" ", "-", strtolower($posts['registro_tabs'])) . ", id:{$lastID}]");
                $this->db->update($tabela, $shortCode, "id={$lastID}");
                $msg = "Criado com sucesso!!!";
            } else {
                $msg = $ins->msg;
            }
            return json_encode(array('status' => $ins->status, 'msg' => $msg, 'id' => $lastID, 'shorcode' => $shortCode['shortcode_tabs'], 'title' => $posts['registro_tabs']));
        } catch (Exception $exc) {
            return json_encode(array('status' => false, 'msg' => $exc->getMessage()));
        }
    }

    /* =========================================================================
     * METODO QUE ATUALIZA OS DADOS DAS ABA/ANCORAS
      ========================================================================= */

    public function updateTabs($posts,$id_tab_post) {
        try {
            if (!is_array($posts)) {
                throw new Exception("Erro nao definicao dos parametros - Error in: " . __METHOD__ . " line: " . __LINE__, 110);
            } else if (empty($posts['nome_tabs']) || empty($posts['conteudo_tabs'])) {
                throw new Exception("Todos os campos são de preenchimento obrigatorio");
            }else if (empty ($id_tab_post)){
                throw new Exception("Ocorreu um erro inesperado - Error in: " . __METHOD__ . " line: " . __LINE__, 110);
            }
            $tabela = "cms_tab_post";
            $dados = array('nome_tabs'=>$posts['nome_tabs'],'conteudo_tabs'=>$posts['conteudo_tabs']);
            $upd = json_decode($this->db->update($tabela, $dados, "id={$id_tab_post} AND id_tabs = {$posts['id_tabs']}"));
            return json_encode(array("status"=>$upd->status, "msg"=>$upd->msg));
        } catch (Exception $ex) {
            return json_encode(array('status' => false, 'msg' => $exc->getMessage()));
        }
    }

    /* =========================================================================
     * METODO QUE DELETA AS ABAS/ANCORAS
      ========================================================================= */

    public function deleteTabs($id, $table) {
        try {
            $del = json_decode($this->db->delete($table,"id = {$id}"));
            return json_encode(array("status"=>$del->status,"msg"=>$del->msg));
        } catch (Exception $ex) {
            return json_encode(array('status' => false, 'msg' => $exc->getMessage()));
        }
    }

}
